import QtQuick 1.0
import "../Models/"
import "../Delegates/"
import "../Util/Util.js" as Util

//メニュー

Rectangle {
    id: _root
    x: 0
    y: 0
    radius: 5
    gradient: Gradient {
        GradientStop {
            position: 0
            color: "#040240"
        }

        GradientStop {
            position: 1
            color: "#000a16"
        }
    }
    border.width: 2
    border.color: "#6bcbf7"
    height: 1

    property real itemHeightRatio: 2.5      // デリゲートのアイテムの高さの倍率
    property real density: 1.0              // 密度

    property alias model: _list.model
    signal clicked(int index)    //クリックイベント
    signal pressed(variant event, int index)

    // フォーカス設定
    function setForceActiveFocus(){
        _list.currentIndex = 0;
        _list.forceActiveFocus();
    }

    // インデックスを変更
    function setCurrentIndex(index){
        if(index < 0){
            // 一番下へループ
            _list.positionViewAtEnd();
            _list.currentIndex = _list.count - 1;
            Util.outputDebugString("loop to bottom:" + _list.currentIndex + "," + index);
        }else if(index >= _list.count){
            // 一番上へループ
            _list.positionViewAtBeginning();
            _list.currentIndex = 0;
            Util.outputDebugString("loop to top:" + _list.currentIndex + "," + index);
        }else{
            _list.positionViewAtIndex(index, ListView.Visible);
            _list.currentIndex = index;
            Util.outputDebugString("move:" + _list.currentIndex + "," + index);
        }
    }
    // インデックスを取得
    function getCurrentIndex(){
        return _list.currentIndex;
    }

    // 中身をクリアする
    function clear(){
        _root.height = 1;
    }

    Keys.onPressed: {
        pressed(event, _list.currentItem.itemIndex);
        switch(event.key){
        case Qt.Key_Escape:
        case Qt.Key_Enter:
        case Qt.Key_Return:
            _list.currentIndex = 0;
            break;
        case Qt.Key_Up:
            // 一番下へループ
            if(_list.currentIndex === 0){
                _list.currentIndex = _list.count - 1;
            }else{
            }


            break;
        case Qt.Key_Down:
            if(_list.currentIndex === (_list.count - 1)){
                // 一番上へループ
                _list.currentIndex = 0;
            }

            break;

        default:
            break;
        }
    }

    ////////////////////////////////////
    // ハイライト用
    Component {
        id: _highlightBar
        Rectangle {
            width: (_list.currentItem === null) ? 0 : _list.currentItem.width
            height: (_list.currentItem === null) ? 0 : _list.currentItem.height
            color: "#995F2833"
            radius: 5
            y: (_list.currentItem === null) ? 0 : _list.currentItem.y;
            Behavior on y { SmoothedAnimation { duration: 200 } }
//            Behavior on y { SpringAnimation { spring: 2; damping: 0.1 } }
        }
    }

    ListView {
        id: _list
        anchors.fill: parent
        // ハイライト設定
        highlight: _highlightBar
        highlightFollowsCurrentItem: false
        clip: true

        // -のところをスキップする
        property int prevIndex: 0
        onCurrentIndexChanged: {
            var offset = 0;
            if(currentItem === null){
            }else{
                if(currentItem.itemTitle === "-"){
                    if(prevIndex > currentIndex){
                        // 上へ移動
                        offset = -1;
                    }else{
                        // したへ移動
                        offset = 1;
                    }
                }
                prevIndex = currentIndex;
                if(offset === 0){
                    // nop
                }else{
                    currentIndex += offset;
                }
            }
        }

        delegate: DelegateContext {
            id: _delegate
            heightRatio: itemHeightRatio
            density: _root.density
            itemIndex: _index
            itemTitle: _title

            Component.onCompleted: {
                _root.width = _delegate.width;
                _root.height += _delegate.height;// + 1;
                // ↑の+1がポイント
                // １アイテム出来る事にココが呼ばれるので高さを
                // +1して次のアイテムも見える範囲に入れて生成を促す
                // と思ったけど最初の高さを１にしてるからここで１足すのは余分ｗ

//                Util.outputDebugString("title=" + _title
//                                       + ",rh=" + _root.height
//                                       + ",ch=" + _list.contentHeight
//                                       + ",dh=" + _delegate.height)
            }

            onClicked: {
                _root.clicked(itemIndex);
            }
        }
    }

    onHeightChanged: {
        if(parent.height <= 0){
        }else if((y + height) <= parent.height){
            //ok
        }else{
            // はみ出てる
            height = parent.height - y - 2;
        }
    }

    //領域外にコンテキストがはみ出るなら調整する
    function adjustX(x){
        if((x + width) <= parent.width){
            //はみ出ない
        }else{
            //はみ出てる
            x = parent.width - width - 5;
            if(x < 0){
                x = 0;
            }
        }
        return x;
    }
    function adjustY(y){
        if((y + height) <= parent.height){
            //はみ出ない
        }else{
            //はみ出てる
            y = parent.height - height - 5;
            if(y < 0){
                y = 0;
            }
        }
        return y;
    }
}

